---
title: 正则表达式——精解
description: 正则表达式——精解
image: /img/regexp.jpg
date: 2022-03-28 17:09:58
---
import Alert from '@/components/post/alert.astro'

[[toc]]

## 历史

起源于神经网络，20 世纪 40 年代由两位神经生理学家研究得出的一种**使用数学方式描述神经网络的方法**

## 存在的缘由

使我们能够更加高效的匹配或获取特定的规则集合

## 如何做到

**设定特定的子规则，让某些符号不再代表本身，而是代表一些子规则**

## 元字符

### 字符组

`[abc]` **包含**中括号中的任意一个字符

### 取反字符组

`[^abc]` **除了**中括号中的任意一个字符


### 常用字符组

`.` **除换行符之外的任意字符 `[^\n\r\u2020\u2029]`**

`\d` 任意**数字**, `\D` 任意**非数字**

`\w` 任意**单词(数字字母下划线)**, `\W` 任意**非单词**

`\s` 任意**空白字符**, `\S` 任意**非空白字符**

### 空白字符

`\s` **最常用**

`\r` 回车

`\n` 换行

`\f` 换页

`\t` 制表

`\v` 垂直制表

### 逻辑字符

`|` 或

## 量词

`*` **0~n 次**

`+` **1~n 次**

`?` **0~1 次**

`{m}` **m 次**

`{m,}` **至少 m 次**

`{m, n}` **m~n 次**


## 模式(修饰符)

`i` 忽略大小写

`m` 多行匹配

`g` 全局匹配

## 位置信息(重要！！！)

`^` 以某字符开始

`$` 以某字符结束

`\b` **单词边界，匹配到 `\w` 之外的字符就终止匹配(eg:`\btom\b`)**

`(?<=Y)` **左边字符为 Y**

`(?<!Y)` **左边字符不为 Y**

`(?=Y)` **右边字符为 Y**

`(?!Y)` **右边字符不为 Y**

<Alert type="info">**有尖括号则为左，等号肯定感叹否**</Alert>

## 分组匹配(重要！！！)

<Alert type="danger">**IPhone 不支持(2022-04-08)，直接白屏！！！**</Alert>

### 定义

**第几个左括号就是第几个分组**

`(?:pattern)` **非捕获分组**

`(?<name>)` **命名分组**

### 使用

正则表达式中，**直接以 `\分组编号使用`**

API 中，以 `$分组编号使用`

**命名分组 `\k<name>` `$<name>`**

```js
const {
  day,
  month,
  year
} = '03-28-2022'
      .match(/(?<month>\d{2})-(?<day>\d{2})-(?<year>\d{4})/)
      .groups ;
```

## 相关 API

校验内容

提取内容

替换内容

切割内容

### `String.prototype`

**.match(str | reg)**
- **传入的字符串也会被转换为正则**
- **一般配合 g 修饰符使用，返回所有符合要求的内容**
- 不加 g 返回标准匹配格式


**.split(reg, max = 结果数组的最大长度)**
- 传入的字符串也会被转换为正则

```js
'apple, pear!, orange'.split(/\w+/);
// ['', ', ', '!, ', '']
'apple, pear!, orange'.split(/\W+/);
// ['apple', 'pear', 'orange']
'apple, pear!, orange'.split(/\W+/, 1);
// ['apple']

// 分组匹配，结果数组包含分隔符！！！
'apple, pear!, orange'.split(/(\W+)/, 10)
// ['apple', ', ', 'pear', '!, ', 'orange']
```


**.search(str | reg)**
- 传入的字符串也会被转换为正则

**.replace(reg, replacement | fn)**
- 第二个参数为字符串时，可以包含 `$` 等特殊参数
- 第二个参数为函数时，返回值即为替换内容

### `RegExp.prototype`

**.test(str)**

**.exec(str)**
- 比 match 更加强大

```js
while (res = regexp.exec(str)) {
  console.log(res, regexp.lastIndex);
}
```